package com.ruoyi.web.controller.wx;

import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginBody;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.service.ISysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.Map;

/**
 * 微信登录控制器
 *
 * @author ruoyi
 */
@RestController
public class WxLoginController extends BaseController
{
    @Autowired
    private ISysUserService userService;

    @Autowired
    private TokenService tokenService;

    @Autowired
    private RestTemplate restTemplate;

    // 微信小程序AppID
    @Value("${wx.miniapp.appid}")
    private String appId;

    // 微信小程序AppSecret
    @Value("${wx.miniapp.secret}")
    private String appSecret;

    /**
     * 根据微信code获取openId
     *
     * @param code 请求参数，包含code
     * @return 结果
     */
    @GetMapping("/getOpenId")
    public AjaxResult getOpenId(@RequestParam String code)
    {
        if (StringUtils.isBlank(code)) {
            return AjaxResult.error("code不能为空");
        }

        // 调用微信接口获取openId
        String url = String.format("https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code",
                appId, appSecret, code);

        try {
            // 调用微信接口
            String result = restTemplate.getForObject(url, String.class);
            JSONObject jsonObject = JSONObject.parseObject(result);
            // 检查是否有错误
            if (jsonObject.containsKey("errcode")) {
                Integer errcode = (Integer) jsonObject.get("errcode");
                if (errcode != 0) {
                    String errmsg = (String) jsonObject.get("errmsg");
                    return AjaxResult.error("获取openId失败：" + errmsg);
                }
            }

            // 提取openId
            String openId = (String) jsonObject.get("openid");
            String sessionKey = (String) jsonObject.get("session_key");

            Map<String, String> data = new HashMap<>();
            data.put("openId", openId);
            data.put("sessionKey", sessionKey);

            return AjaxResult.success(data);
        } catch (Exception e) {
            return AjaxResult.error("获取openId失败：" + e.getMessage());
        }
    }

    /**
     * 根据OpenID登录
     *
     * @param loginBody 请求参数，包含openid
     * @return 结果
     */
    @PostMapping("/loginByOpenid")
    public AjaxResult loginByOpenid(@RequestBody LoginBody loginBody)
    {
        AjaxResult ajax = AjaxResult.success();
        String openid = loginBody.getOpenId();
        if (StringUtils.isBlank(openid)) {
            return AjaxResult.error("openid不能为空");
        }

        // 根据openid查询用户
        SysUser user = userService.selectUserByOpenid(openid);

        if (user == null) {
            // 用户不存在，自动注册
            user = new SysUser();
            user.setOpenid(openid);
            user.setUserName("wx_" + openid.substring(0, 10)); // 生成默认用户名
            user.setNickName("微信用户"); // 默认昵称
            user.setPassword("123456"); // 默认密码
            user.setStatus("0"); // 正常状态
            user.setDelFlag("0"); // 未删除

            // 调用用户注册方法
            userService.registerUser(user);

            // 重新查询用户，获取完整信息
            user = userService.selectUserByOpenid(openid);
        }

        // 生成JWT Token
        LoginUser loginUser = new LoginUser(user.getUserId(), user.getDeptId(), user, null);
        String token = tokenService.createToken(loginUser);
        ajax.put(Constants.TOKEN, token);
        return ajax;
    }
}
